package 面向对象中级.房屋出租系统;
import java.util.Scanner;

    public class Utility {
        //静态属性
        private static Scanner scanner = new Scanner(System.in);
        /**
         * 功能：读取键盘输⼊的⼀个菜单选项，值：1——6的范围
         *
         * @return 1——6
         */
        public static char readMenuSelection() {
            char c;
            for (; ; ) {
                String str = readKeyBoard(1, false);//包含⼀个字符的字符串
                c = str.charAt(0);
                if (c != '1' && c != '2' && c != '3' && c != '4' && c != '5'&& c != '6') {
                    System.out.println("选择错误，请重新输⼊：");
                } else break;
            }
            return c;
        }
        /**
         * 功能：读取键盘输⼊的⼀个字符
         *
         * @return ⼀个字符
         */
        public static char readChar() {
            String str = readKeyBoard(1, false);//读取字符
            return str.charAt(0);
        }

        /**
         * 功能：读取键盘输⼊的⼀个字符，如果直接按回⻋，则返回指定的默认值；否则返回输⼊的那个字符
         *
         * @param defaultValue 指定的默认值
         * @return 默认值或输⼊的字符
         */
        public static char readChar(char defaultValue) {
            String str = readKeyBoard(1, true);//读取结果不是字符就是⼀个空的字符串
            return (str.length() == 0) ? defaultValue : str.charAt(0);
        }

        /**
         * 功能：读取键盘输⼊的整型，⻓度⼩于10位
         *
         * @return 整数
         */
        public static int readInt() {
            int n;
            for (; ; ) {
                String str = readKeyBoard(10, true);//读取⼀个整数，⻓度<=10位
                try {
                    n = Integer.parseInt(str);//进⾏转型，字符转换成整数
                    break;
                } catch (NumberFormatException e) {
                    System.out.println("数字输⼊的有错误，请重新输⼊！");
                }
            }
            return n;
        }

        /**
         * 功能：读取键盘输⼊的 整数或默认值，如果直接回⻋，则返回默认值，否则返回输⼊的整数
         *
         * @param defaultValue 指定的默认值
         * @return 整数或默认值
         */
        public static int readInt(int defaultValue) {
            int n;
            for (; ; ) {
                String str = readKeyBoard(10, true);
                if (str.equals("")) {
                    return defaultValue;
                }
                //异常处理
                try {
                    n = Integer.parseInt(str);
                    break;
                } catch (NumberFormatException e) {
                    System.out.println("数字输⼊的有错误，请重新输⼊！");
                }
            }
            return n;
        }

        /**
         * 功能：读取键盘输⼊的指定⻓度的字符串
         *
         * @param limit 限制的⻓度
         * @return 指定⻓度的字符串
         */
        public static String readString(int limit) {
            return readKeyBoard(limit, false);
        }

        /**
         * 功能：读取键盘输⼊的指定⻓度的字符串或默认值，如果直接回⻋，返回默认值，否则返回字符串
         *
         * @param limit        限制的⻓度
         * @param defaultValue 指定的默认值
         * @return 指定⻓度的字符串
         */
        public static String readString(int limit, String defaultValue) {
            String str = readKeyBoard(limit, true);
            return str.equals("") ? null : str;
        }

        /**
         * 功能：读取键盘输⼊的确认选项，Y或N
         * 将⼩的功能，封装到⼀个⽅法中.
         *
         * @return Y或N
         */
        public static char readConfirmSelection() {
            System.out.println("请输⼊你的选择（Y/N）");
            char c;
            for (; ; ) {
                //将接受的字符转换成⼤写字⺟
                String str = readKeyBoard(1, false).toUpperCase();
                c = str.charAt(0);
                if (c == 'Y' || c == 'N') {
                    break;
                } else {
                    System.out.println("选择有错误，请重新输⼊！");
                }
            }
            return c;
        }

        /**
         * 功能： 读取⼀个字符串
         *
         * @param limit       读取的⻓度
         * @param blankReturn 如果为true ,表示 可以读空字符串。
         *                    如果为false表示 不能读空字符串。
         *                    <p>
         *                    如果输⼊为空，或者输⼊⼤于limit的⻓度，就会提示重新输⼊。
         * @return
         */
        public static String readKeyBoard(int limit, boolean blankReturn) {
            //定义⼀个字符串
            String line = "";
            while (scanner.hasNextLine()) {//判断是否有下⼀⾏
                line = scanner.nextLine();
                //如果line.length=0, 即⽤户没有输⼊任何内容，直接回⻋
                if (line.length() == 0) {
                    if (blankReturn) return line;//如果blankReturn=true,可以返回空串
                    else continue; //如果blankReturn=false,不接受空串，必须输⼊内容
                }
                //如果⽤户输⼊的内容⼤于了 limit，就提示重写输⼊
                //如果⽤户如的内容 >0 <= limit ,我就接受
                if (line.length() < 1 || line.length() > limit) {
                    System.out.print("输⼊⻓度（不能⼤于" + limit + "）错误，请重新输⼊：");
                    continue;
                }
                break;
            }
            return line;
        }
    }
